import requests
from config.Peizhi import chaundd
from datetime import datetime

# 从配置文件中获取泵相关的参数配置
cdd1 = chaundd()

# 获取泵名称的函数
def bengdata():
    # 定义 API 请求的 URL
    url = "http://222.134.245.144:17000/chuanganqi/FieldConfigModel/"
    # 发送 GET 请求
    response = requests.get(url)
    # 检查请求是否成功
    if response.status_code == 200:
        # 将响应内容转换为 JSON 格式
        data = response.json()
        # 获取结果列表
        results = data.get("results", [])
        # 检查结果列表是否有效
        if results and isinstance(results, list):
            # 用于存储标准化的泵名称
            pump_names = []
            # 遍历每个结果
            for result in results:
                # 获取主副泵的数据
                zhufubeng_data = result.get("zhufubeng", [])
                # 遍历每个主副泵信息
                for pump_info in zhufubeng_data:
                    # 获取泵的类型
                    pump_type = pump_info["pump"]
                    # 获取泵的名称
                    pump_name = pump_info["name"]
                    # 统一键格式，去除多余描述，使用"泵名称-类型"格式
                    if pump_type == "主泵":
                        pump_names.append(f"{pump_name}-主泵")
                    elif pump_type == "副泵":
                        pump_names.append(f"{pump_name}-副泵")
            # 检查泵名称列表长度是否至少为 2
            if len(pump_names) >= 2:
                # 返回标准化的两个泵名称
                return pump_names[0], pump_names[1]
            else:
                # 处理数据不足的情况
                return "未知主泵", "未知副泵"
        else:
            print("未找到有效的 zhufubeng 数据")
            return "未定义主泵", "未定义副泵"
    else:
        print(f"请求失败，状态码: {response.status_code}")
        return "请求失败主泵", "请求失败副泵"

# 模拟获取泵运行状态（True 表示运行，False 表示停止）
def get_status():
    # 获取 restAPI 路径
    url1 = "http://222.134.245.144:17000//chuanganqi/BopPanelModel/"
    # 读取路径里面的数据
    response = requests.get(url1)
    # 检查请求是否成功
    if response.status_code == 200:
        # 转换为 JSON 格式
        data = response.json()
        # 获取数据
        results = data.get("results", [])
        # 获取最新的结果
        latest_result = results[-1]
        # 获取电机 1 的数据
        beng1 = latest_result.get("dian_beng_1")
        # 获取电机 2 的数据
        beng2 = latest_result.get("dian_beng_2")
        # 获取电机 1 的灯状态
        device_id1 = beng1.get("deng")
        # 获取电机 2 的灯状态
        device_id2 = beng2.get("deng")
        # 获取主泵和副泵的名称
        zhu, fu = bengdata()
        # 根据主泵名称判断返回的状态字典
        if zhu == "1#pump-主泵":
            return {"主泵": device_id1, "副泵": device_id2}
        else:
            return {"主泵": device_id2, "副泵": device_id1}

# 模拟获取泵震动数据（工作状态）
def get_vibration(pump_name):
    # 根据泵名称返回对应工作振动数据（电机 + 泵体）
    pump_main, pump_f = get_status()
    if pump_main in pump_name:
        return {
            "motor": cdd1.pump_main1,  # 主泵电机工作振动
            "body": cdd1.pump_main2  # 主泵泵体工作振动
        }
    elif pump_f in pump_name:
        return {
            "motor": cdd1.pump_f1,  # 副泵电机工作振动
            "body": cdd1.pump_f2  # 副泵泵体工作振动
        }
    return {}

# 泵不工作时的震动数据（主副泵统一值）
def get_zhi():
    return {
        "motor": cdd1.stop_main1,  # 电机不工作振动值（主副泵统一）
        "body": cdd1.stop_f1  # 泵体不工作振动值（主副泵统一）
    }

# 获取储能器压力值的函数
def get_pressure():
    # 定义 API 请求的 URL
    url = "http://222.134.245.144:17000//chuanganqi/BopPanelModel/"
    # 发送 GET 请求
    response = requests.get(url)
    # 检查请求是否成功
    if response.status_code == 200:
        # 将响应内容转换为 JSON 格式
        data = response.json()
        # 获取结果列表
        results = data.get("results", [])
        # 获取第一个结果
        latest_result = results[0]
        # 获取储能器的压力值
        chu_neng_qi_ya_li = latest_result.get("chu_neng_qi_ya_li")
        # 将压力值转换为整数
        a = int(chu_neng_qi_ya_li)
    return a

# 检查传动皮带或链条是否断裂（关键逻辑）
def Cdd():
    # 获取状态字典（键格式："泵名称-类型"）
    pumps = get_status()
    print(pumps)
    # 获取压力值
    pressure = get_pressure()
    # 不工作振动数据（主副泵统一）
    non_working = get_zhi()
    # 遍历每个泵的状态
    for pump_name, running in pumps.items():
        # 跳过不运行的泵
        if not running:
            continue
        # 获取当前泵的工作振动数据
        working_vibration = get_vibration(pump_name)
        # 检查是否找到振动数据
        if not working_vibration:
            print(f"警告：未找到 {pump_name} 的振动数据，跳过检查")
            continue
        # 定义振动差值的阈值
        num = 2
        # 计算电机振动差值
        motor_differences = [w - nw for w, nw in zip(working_vibration["motor"], non_working["motor"])]
        # 计算泵体振动差值
        body_differences = [w - nw for w, nw in zip(working_vibration["body"], non_working["body"])]

        print(f"{pump_name} 电机振动差值: {motor_differences}")
        print(f"{pump_name} 泵体振动差值: {body_differences}")
        # 标记电机振动是否异常
        flag1 = False
        # 检查电机振动差值是否异常
        for i in motor_differences:
            if i < num or i > -num:
                flag1 = True
        # 标记泵体振动是否异常
        flag2 = False
        # 检查泵体振动差值是否异常
        for j in motor_differences:
            if j < num or j > -num:
                flag2 = True
        # 判断是否检测到传动皮带或链条断裂
        if flag1 and flag2 and pressure <= 2600:
            print(f"{pump_name} 检测到传动皮带或链条断裂")
            # 推送到 Django REST framework
            send_fault_to_django(pump_name, pressure)
            return True
        else:
            print(f"{pump_name} 未检测到传动皮带或链条断裂")

# 发送故障信息到 Django REST framework 的函数
def send_fault_to_django(pump_name, pressure):
    # 定义 Django REST framework 的 API URL
    url = "http://222.134.245.144:17000/weizhang/VioModel/"
    # 获取当前时间并格式化
    now = datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
    # 构造故障信息字典
    data = {
        "gu_zhang_ming_cheng": "传动皮带或链条断裂",
        "she_bei_ming_cheng": pump_name,
        "she_bei_qu_yu": "泵组",
        "gu_zhang_shi_jian": now,
        "gu_zhang_lei_xing": "越限",
        "shi_ji_zhi": pressure,
        "gao_jing_zhi": 5.0,
        "gu_zhang_miao_shu": f"{pump_name}（运行中），蓄能器压力不升高，振动传感器的观测值异常",
        "chu_li_zhuang_tai": "未处理"
    }
    try:
        # 发送 POST 请求
        response = requests.post(url, json=data)
        # 检查请求是否成功
        if response.status_code == 201:
            print(f"成功推送故障信息到 Django REST framework: {response.json()}")
        else:
            print(f"推送故障信息失败，状态码: {response.status_code}, 响应内容: {response.text}")
    except requests.RequestException as e:
        print(f"请求发生错误: {e}")

# 调用检查函数
Cdd()